# 图像分割，标记硬币轮廓
import cv2
import numpy as np
# 引入新的显示图像的库
from matplotlib import pyplot as plt 

# 获取背景
# 1.通过二值化得到黑白图片
# 2.通过形态学获取背景

img = cv2.imread('E:\\opencv_photo\\water_coins.jpeg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)    # 灰度化
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)  # 自适应阈值 ， 二值化

# 开运算，去除噪点
kernel = np.ones((3,3),np.int8)
open1 = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2)
# 膨胀
bg = cv2.dilate(open1, kernel, iterations=1)    # 背景

# 获取前景物体
dist = cv2.distanceTransform(open1, cv2.DIST_L1, 5)
# 二值化
ret, fg = cv2.threshold(dist, 0.7*dist.max(), 255, cv2.THRESH_BINARY)

# plt.imshow(dist, cmap='gray')    # 使用该函数显示图片，不需要设置窗口的名字，以灰度图显示
# plt.show()
# exit()

# 获取未知区域
fg = np.uint8(fg)   # 两者类型一致才能进行相减
unknow = cv2.subtract(bg,fg)

# 创建前景连通域
ret, marker = cv2.connectedComponents(fg)
marker = marker + 1  # 前景
marker[unknow == 255] = 0   # 背景

# 进行图像分割
result = cv2.watershed(img, marker)
img[result == -1] = [0,0,255]   # -1的地方设为红色

cv2.imshow('img',img)
cv2.imshow('fg',fg)     # 前景
cv2.imshow('bg',bg) # 背景
cv2.imshow('unknow',unknow) # 未知区域
cv2.waitKey()